/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.fatecpg.operon.frames;

import br.com.fatecpg.operon.Conexao;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

class EstruturaAtribuicao {
    private int profId;
    private String profNome;
    private int disciplinaId;
    private String disciplinaNome;
    private int cursoId;
    private String cursoSigla;
    private int horarioId;
    private String horarioDesc;
    private int salaAulaId;

    public int getCursoId() {
        return cursoId;
    }

    public void setCursoId(int cursoId) {
        this.cursoId = cursoId;
    }

    public String getCursoSigla() {
        return cursoSigla;
    }

    public void setCursoSigla(String cursoSigla) {
        this.cursoSigla = cursoSigla;
    }

    public int getDisciplinaId() {
        return disciplinaId;
    }

    public void setDisciplinaId(int disciplinaId) {
        this.disciplinaId = disciplinaId;
    }

    public String getDisciplinaNome() {
        return disciplinaNome;
    }

    public void setDisciplinaNome(String disciplinaNome) {
        this.disciplinaNome = disciplinaNome;
    }

    public String getHorarioDesc() {
        return horarioDesc;
    }

    public void setHorarioDesc(String horarioDesc) {
        this.horarioDesc = horarioDesc;
    }

    public int getHorarioId() {
        return horarioId;
    }

    public void setHorarioId(int horarioId) {
        this.horarioId = horarioId;
    }

    public int getProfId() {
        return profId;
    }

    public void setProfId(int profId) {
        this.profId = profId;
    }

    public String getProfNome() {
        return profNome;
    }

    public void setProfNome(String profNome) {
        this.profNome = profNome;
    }

    public int getSalaAulaId() {
        return salaAulaId;
    }

    public void setSalaAulaId(int salaAulaId) {
        this.salaAulaId = salaAulaId;
    }
       
}



public class DistribuicaoHorarioIFrame extends javax.swing.JInternalFrame {

    private String txt = "Esta operação irá gerar uma nova grade de horários" +
                "podem haver alterações/perdas de informações" +
                "\ncadastradas anteriormente." +
                "\nDeseja continuar?";
    

    private ArrayList<EstruturaAtribuicao> getAtribuicoes() {
        ArrayList<EstruturaAtribuicao> lstDisponibilidades = new ArrayList<EstruturaAtribuicao>();
        String sql = "select p.prof_id, p.nome, d.disciplina_id, d.titulo, c.curso_id, c.sigla, h.horario_id, h.dia_da_semana|| ' - ' ||h.horario " +
                        "from professores p " +
                        "inner join disp_horaria dh on dh.prof_id = p.prof_id " +
                        "inner join horarios_de_aula h on h.horario_id = dh.horario_id " + 
                        "inner join disp_disciplinas dd on dd.prof_id = p.prof_id " +
                        "inner join disciplinas d on d.disciplina_id = dd.disciplina_id " +
                        "inner join cursos c on c.curso_id = d.curso_id " +
                        "where dh.prof_id is not null and dd.prof_id is not null and dd.disciplina_id is not null and dh.horario_id is not null";
        
        try {
            //Conexao.Conectar();
            ResultSet rs = Conexao.con.createStatement().executeQuery(sql);

            while(rs.next()) {
                EstruturaAtribuicao atr = new EstruturaAtribuicao();
                atr.setProfId(rs.getInt(1));
                atr.setProfNome(rs.getString(2));
                atr.setDisciplinaId(rs.getInt(3));
                atr.setDisciplinaNome(rs.getString(4));
                atr.setCursoId(rs.getInt(5));
                atr.setCursoSigla(rs.getString(6));
                atr.setHorarioId(rs.getInt(7));
                atr.setHorarioDesc(rs.getString(8));
                atr.setSalaAulaId(1);
                
                lstDisponibilidades.add(atr);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage());
        }  
        
        return lstDisponibilidades;
    }
    
    private ArrayList<EstruturaAtribuicao> validaAtribuicoes(ArrayList<EstruturaAtribuicao> lista) {
        ArrayList<EstruturaAtribuicao> retornoErro = new ArrayList<EstruturaAtribuicao>();
        int index = 0;
        for (EstruturaAtribuicao atr : lista) {
            for (int i = 0; i < lista.size(); i++) {
                EstruturaAtribuicao ea = lista.get(i);
                if (index == i) {
                    continue;
                }
                if (atr.getProfId() == ea.getProfId() && atr.getDisciplinaId() == ea.getDisciplinaId()
                        && atr.getCursoId() == ea.getCursoId() && atr.getHorarioId() == ea.getHorarioId()) {
                    retornoErro.add(ea);
                    lista.remove(i);                   
                }
                if (atr.getDisciplinaId() == ea.getDisciplinaId()
                        && atr.getCursoId() == ea.getCursoId() && atr.getHorarioId() == ea.getHorarioId()) {
                    retornoErro.add(ea);
                    lista.remove(i); 
                }
                if (atr.getHorarioId() == ea.getHorarioId() && atr.getSalaAulaId() == ea.getSalaAulaId()) {
                    retornoErro.add(ea);
                    lista.remove(i);  
                }
            }
            
            index++;  
        } 
        return retornoErro;
    }
    
    private boolean incluiAtrbuicao(EstruturaAtribuicao atr) {
        boolean resultado;
        
        try {
            //obtem o id maximo cadastrado
            //necessario por não existir campo ID com auto-incremento 
            //na tabela atribuicoes
            String sql = "select max(atrib_id) from atribuicoes";
            //Conexao.Conectar();
            ResultSet rsMax = Conexao.con.createStatement().executeQuery(sql);
            int maxID = (rsMax.next()) ? rsMax.getInt(1) : 0;
            
            String insertSql = "insert into atribuicoes values(" + ++maxID + ", " + atr.getProfId() +
                    ", " + atr.getDisciplinaId() + ", " + atr.getHorarioId() +
                    ", " + atr.getSalaAulaId() + ")";
            
            if (Conexao.con.createStatement().executeUpdate(insertSql) > 0)
                resultado = true;
            else
                resultado = false;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
            resultado =  false;
        }
        
        return resultado;
    }
    
    private void deletaAtribuicoes() {
        try {
            String sql = "delete from atribuicoes";
            Conexao.con.createStatement().execute(sql);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
        }
    }
    
    public DistribuicaoHorarioIFrame() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        horariosTable = new javax.swing.JTable();
        consultarGradeButton = new javax.swing.JButton();
        gerarGradeButton = new javax.swing.JButton();
        sairButton = new javax.swing.JButton();

        addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
            public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
                formInternalFrameActivated(evt);
            }
            public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
            }
        });

        horariosTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nome", "Disciplina", "Curso", "Horário", "Sala"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, true, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane1.setViewportView(horariosTable);

        consultarGradeButton.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        consultarGradeButton.setText("Consultar grade horária");
        consultarGradeButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                consultarGradeButtonActionPerformed(evt);
            }
        });

        gerarGradeButton.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        gerarGradeButton.setText("Gerar grade horária");
        gerarGradeButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gerarGradeButtonActionPerformed(evt);
            }
        });

        sairButton.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        sairButton.setText("Sair");
        sairButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sairButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(consultarGradeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 93, Short.MAX_VALUE)
                        .addComponent(gerarGradeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(87, 87, 87)
                        .addComponent(sairButton, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 307, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(consultarGradeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(gerarGradeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(sairButton, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void consultarGradeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_consultarGradeButtonActionPerformed
        DefaultTableModel modelo = (DefaultTableModel) horariosTable.getModel();
        modelo.setRowCount(0);
        String sql = "select p.nome, d.titulo, c.sigla, h.dia_da_semana|| ' - ' ||h.horario, s.titulo from atribuicoes a " +
                        "inner join professores p on p.prof_id = a.prof_id " +
                        "inner join disciplinas d on d.disciplina_id = a.disciplina_id " +
                        "inner join cursos c on c.curso_id = d.curso_id " +
                        "inner join horarios_de_aula h on h.horario_id = a.horario_id " +
                        "inner join salas_de_aula s on s.sala_id = a.sala_id " +
                        "where a.prof_id is not null and a.disciplina_id is not null and a.horario_id is not null " +
                        "and a.sala_id is not null";
        try {
            ResultSet rs = Conexao.con.createStatement().executeQuery(sql);
                while(rs.next()) {
                    modelo.addRow(new Object[] {
                        rs.getString(1),
                        rs.getString(2),
                        rs.getString(3),
                        rs.getString(4),
                        rs.getString(5)
                    });

                }
                
                if (modelo.getRowCount() == 0) {
                JOptionPane.showMessageDialog(this, "Não há grade horária cadastrada.\n" +
                        "Utilize o botão 'Gerar nova grade horária' para gerar uma grade");
            }
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage());
        }
    }//GEN-LAST:event_consultarGradeButtonActionPerformed

    private void gerarGradeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gerarGradeButtonActionPerformed
        ArrayList<EstruturaAtribuicao> lst;
        ArrayList<EstruturaAtribuicao> lstErros;
        int cont = 0;
        int registros = 0;
                
        if (JOptionPane.showConfirmDialog(this, txt) == JOptionPane.OK_OPTION) {
            lst = getAtribuicoes();
            if (!lst.isEmpty()) {
                lstErros = validaAtribuicoes(lst);
                deletaAtribuicoes();
                
                while(cont < lst.size()) {
                    incluiAtrbuicao(lst.get(cont));
                    ++registros;
                    cont++;
                }
                
                if (!lstErros.isEmpty()) {
                    String erros = "";
                    for (EstruturaAtribuicao ea : lstErros) {
                       erros += ea.getProfNome() + " " + ea.getDisciplinaNome() + " " + ea.getCursoSigla() + " " + ea.getHorarioDesc() + "\n"; 
                    }
                   JOptionPane.showMessageDialog(this, "Foram incluidos " + registros + 
                           "\nVerifique detalhes ao clicar no botão 'Consultar grade horária'"); 
                   JOptionPane.showMessageDialog(this, "Os seguintes registros não poderam ser incluidos:\n" +
                           erros +
                           "\nVerifique e corrija os dados no módulo apropriado"); 
                } else {
                    JOptionPane.showMessageDialog(this, "Foram incluidos " + registros + " registros" +
                           "\nVerifique detalhes ao clicar no botão 'Consultar grade horária'");
                }
                
            } else {
                JOptionPane.showMessageDialog(this, "Não há informações suficientes para gerar\n" +
                        "uma nova grade horária");
            }
        } else {
            JOptionPane.showMessageDialog(this, "Operação cancelada");
        }
    }//GEN-LAST:event_gerarGradeButtonActionPerformed

    private void sairButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sairButtonActionPerformed
        if (JOptionPane.showConfirmDialog(this, "Deseja realmente sair?") == JOptionPane.OK_OPTION) {
            try {
                Conexao.Desconectar();
                this.dispose();
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro ao finalizar o módulo");
            }
        }
    }//GEN-LAST:event_sairButtonActionPerformed

    private void formInternalFrameActivated(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameActivated
        try {
            Conexao.Conectar("operon", "operon");
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "Erro ao conectar com a base de dados");
        }
    }//GEN-LAST:event_formInternalFrameActivated

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton consultarGradeButton;
    private javax.swing.JButton gerarGradeButton;
    private javax.swing.JTable horariosTable;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton sairButton;
    // End of variables declaration//GEN-END:variables
}
